import pymysql
from pymysql import cursors
from dbutils.pooled_db import PooledDB

# 数据库连接池配置
db_config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '123456',
    'database': 'test',
    'charset': 'utf8mb4'
}

pool = PooledDB(
    creator=pymysql,  # 使用的数据库模块
    maxconnections=5,  # 连接池最大连接数
    mincached=2,  # 初始化时最少空闲连接数
    maxcached=5,  # 最大空闲连接数
    blocking=True,  # 连接池耗尽时是否阻塞等待
    ping=0,
    **db_config
)



# 通用查询方法
def fetchone(sql: str, params=None):
    """
    执行查询语句
    :param sql: SQL 查询语句（支持参数化）
    :param params: 参数列表或字典，用于防止 SQL 注入
    :return: 查询结果
    """
    conn=pool.connection()
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # type: ignore
    cursor.execute(sql, params)
    result = cursor.fetchone()
    cursor.close()
    conn.close()
    return result
def fetchAll(sql: str, params=None):
    """
    执行查询语句
    :param sql: SQL 查询语句（支持参数化）
    :param params: 参数列表或字典，用于防止 SQL 注入
    :return: 查询结果
    """
    conn=pool.connection()
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # type: ignore
    cursor.execute(sql, params)
    result = cursor.fetchall()
    cursor.close()
    conn.close()
    return result
def insert(sql: str, params=None):
    """
    执行插入语句
    :param sql: SQL 插入语句（支持参数化）
    :param params: 参数列表或字典，用于防止 SQL 注入
    :return: 受影响的行数
    """
    conn = pool.connection()
    cursor = conn.cursor()
    try:
        cursor.execute(sql, params)
        conn.commit()
        return cursor.rowcount
    except Exception as e:
        conn.rollback()
        raise e
    finally:
        cursor.close()
        conn.close()

if __name__ == '__main__':
    sql = "SELECT * FROM user WHERE name = %s"
    params = ('Jone',)
    result = query(sql, params)
    print("查询结果:", result)